giornoN(N):-
	giorno(G),
	N is G+1,
	retract(giorno(G)),
	assert(giorno(N)).

/*predicato che a partire da API3 restituisce API4 */

visita:-
	nGiorni,
	api(Aree),
	visitaGiorno(Aree).
	
visitaGiorno([]):-!.
	
visitaGiorno(Aree):-
	not(Aree=[]),
	giorni(Giorni),
	giornoN(Giorno),
	GiorniLiberi is Giorni-Giorno,
	oreVisita(OreVisita),
	TempoVisita is (OreVisita+1)*60,
	assert(tempo(TempoVisita)),
	listaGiorno(Aree,AreeVisitate),
	saruman(AreeVisitate,AreeVisitateOrdinate,_),
	retractall(tempo(_)),
	assert(areeGiorno(Giorno,AreeVisitateOrdinate)),
	%--eventiGiorno(Giorno),
	findall(A,(member(A,Aree),not(member(A,AreeVisitate))),AreeDaVisitare),
	(GiorniLiberi>0->visitaGiorno(AreeDaVisitare);!).



/* Funzione ricorsiva che divide le aree da visitare nei vari giorni a disposizione (caso base) */
listaGiorno(Aree,AreeVisitate):-
	Aree=[A|[]],
	tempo(Tempo),
	tTot(A,Ttot),
	((Ttot < Tempo)->
		AreeVisitate=[A];
		AreeVisitate=[]).
     

                      
/* Funzione ricorsiva che divide le aree da visitare nei vari giorni a disposizione */
listaGiorno(Aree,AreeVisitate):-
	Aree=[A|RestAree],
	not(RestAree=[]),
	tempo(Tempo),
	tTot(A,Ttot),
	((Ttot < Tempo)->
		(RestTempo is Tempo-Ttot-15,AreaVisitata=[A]);
		(RestTempo is Tempo, AreaVisitata=[])),
	retract(tempo(Tempo)),
	assert(tempo(RestTempo)),
	listaGiorno(RestAree,RestAreeVisitate),
	append(AreaVisitata,RestAreeVisitate,AreeVisitate).
     



eventiGiorno(Giorno):-
	areeGiorno(Giorno,Aree),
	findall(IdEv,(member(IdA,Aree),eventiArea(IdA,EventiArea),member(IdEv,EventiArea)),EventiGiorno),
	assert(eventiGiorno(Giorno,EventiGiorno)).

eventiArea(IdArea,EventiArea):-
	sitiIn(IdArea,Siti),
	findall(IdEvento,(evento(IdEvento),member(IdSito,Siti),eventi(IdEvento,_,_,_,IdSito)),EventiArea).


